#include "ChoixDsListe.h"

#include <QtGui/QApplication>

#include <QtGui/QPushButton>
#include <QtGui/QVBoxLayout>
#include <QtGui/QSlider>
#include <QtGui/QLabel>
#include <QtGui/QGroupBox>

using namespace std;

/** Constructeur standard.

 * On détermine le nom du groupe de widgets, le nombre et le noms des
 * éléments dans la liste des choix. Tous les boutons et autres
 * widgets sont initialisés ici.
 *
 * @param titre nom du groupe (par ex~: "Choix de la classe").
 * @param liste pointeur sur le premier élément de la liste des noms à
 * choix.
 * @param nbr nombre d'éléments dans la liste.
 * @param parent pointeur sur le parent (orphelin par défaul).
 */
ChoixDsListe::ChoixDsListe(const string& titre, string *liste,
			   const unsigned int& nbr, QWidget* parent)
  : BaseUI( "ChoixDsListe", parent ), Nbr( nbr ), selection( 0 )
{
  Texte = liste;

  label = new QLabel( Texte -> c_str(), this );

  slider = new QSlider( Qt::Horizontal, this );
  slider -> setMinimum( 0 );
  slider -> setMaximum( Nbr - 1 );
  slider -> setValue( 0 );

  group = new QGroupBox( trUtf8(titre.c_str()), this );

  boutons.push_back( new QPushButton( trUtf8("&Quitter"), this ) );
  boutons.back() -> setToolTip( trUtf8("Quitter le programme") );
  connect( boutons.back(), SIGNAL( clicked() ), this, SLOT( annuler() ) );
  boutons.push_back( new QPushButton( trUtf8("&OK"), this ) );
  boutons.back() -> setToolTip( trUtf8("Accepter et continuer") );
  connect( boutons.back() , SIGNAL( clicked() ), this, SLOT( fermer() ) );

  QVBoxLayout *vbox = new QVBoxLayout(group);

  vbox -> addWidget( label );
  vbox -> addWidget( slider );

  group -> setLayout( vbox );

  fenetreLayout -> addWidget( group );

  connect( slider, SIGNAL( valueChanged(int) ), this,
	   SLOT( changerValeur(int) ) );

  setFenetreLayout();
}

/**
 * Destructeur, ne fait rien.
 */
ChoixDsListe::~ChoixDsListe()
{}

/** Permet de recueillir le choix effectué.
 * On appelle simplement show() et exec().
 *
 * @return StatusCode, \e true si le choix est validé, \e false
 * sinon. Le choix est dans valeur().
 */
StatusCode ChoixDsListe::demanderChoix()
{
  this -> show();

  qApp -> exec();

  return StatusCode( OK, selection );
}

/** Permet de mettre à jour l'affichage.

 * Est connecté à la barre de défilement, et réalise le changement de
 * l'affichage en temps réel.
 * 
 * Modifie également la valeur de la variable selection.
 */
void ChoixDsListe::changerValeur(const int& val)
{
  selection = val;

  label -> setText( trUtf8( (*(Texte + val)).c_str() ) );
}
